/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.server.services;

import co.com.ces4.produccion.client.ArticuloService;
import co.com.ces4.produccion.jpa.controllers.ArticuloJpaController;
import co.com.ces4.produccion.jpa.controllers.MateriaPrimaArticuloJpaController;
import co.com.ces4.produccion.jpa.controllers.exceptions.IllegalOrphanException;
import co.com.ces4.produccion.jpa.controllers.exceptions.NonexistentEntityException;
import co.com.ces4.produccion.jpa.controllers.exceptions.PreexistingEntityException;
import co.com.ces4.produccion.jpa.entities.Articulo;
import co.com.ces4.produccion.jpa.entities.MateriaPrimaArticulo;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author usuario
 */
public class ArticuloServiceImpl extends RemoteServiceServlet implements ArticuloService {

    @Override
    public void guardarArticulo(Articulo articulo) throws RuntimeException {
        ArticuloJpaController articuloJpaController = (ArticuloJpaController) getServletContext().getAttribute("articuloJpaController");
        try {
            articuloJpaController.create(articulo);
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(ArticuloServiceImpl.class.getName()).log(Level.SEVERE, "El articulo no pudo ser guardado debido a que ya ha sido creado anteriormente" + ex.getMessage());
            throw new RuntimeException("Señor usuario, el articulo ya se encuentra registrado en la base de datos, por tanto no pudo ser almacenado");
        } catch (Exception ex) {
            Logger.getLogger(ArticuloServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
            throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado al intentar guardar el articulo en la base de datos");
        }
    }

    @Override
    public void actualizarArticulo(Articulo articulo) throws RuntimeException {
        MateriaPrimaArticuloJpaController materiaPrimaArticuloJpaController = (MateriaPrimaArticuloJpaController) getServletContext().getAttribute("materiaPrimaArticuloJpaController");
        for (MateriaPrimaArticulo materiaPrimaArticulo : articulo.getMateriaPrimaArticuloList()) {
            try {
                materiaPrimaArticuloJpaController.create(materiaPrimaArticulo);
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(ArticuloServiceImpl.class.getName()).log(Level.SEVERE, "La materia prima articulo no pudo ser guardada debido a que ya ha sido creada anteriormente" + ex.getMessage());
                throw new RuntimeException("Señor usuario, la materia prima articulo ya se encuentra registrada en la base de datos, por tanto no pudo ser almacenada");
            } catch (Exception ex) {
                Logger.getLogger(ArticuloServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
                throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado al guardar la materia prima articulo en la base de datos");
            }
        }
        ArticuloJpaController articuloJpaController = (ArticuloJpaController) getServletContext().getAttribute("articuloJpaController");
        try {
            articuloJpaController.edit(articulo);
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(ArticuloServiceImpl.class.getName()).log(Level.SEVERE, ex.getMessage());
            throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado al intentar actualizar el articulo en la base de datos", ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(ArticuloServiceImpl.class.getName()).log(Level.SEVERE, "El articulo que se intenta actualizar no existe en la base de datos" + ex.getMessage());
            throw new RuntimeException("Señor usuario, el articulo no se encuentra registrado en la base de datos, por tanto no pudo ser actualizado");
        } catch (Exception ex) {
            Logger.getLogger(ArticuloServiceImpl.class.getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
            throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado al intentar actualizar el articulo en la base de datos");
        }
    }

    @Override
    public List<Articulo> getArticulos() throws RuntimeException {
        ArticuloJpaController articuloJpaController = (ArticuloJpaController) getServletContext().getAttribute("articuloJpaController");
        return articuloJpaController.findArticuloEntities();
    }

    @Override
    public List<Articulo> getArticuloList(String codigo, String descripcion) throws RuntimeException {
        ArticuloJpaController articuloJpaController = (ArticuloJpaController) getServletContext().getAttribute("articuloJpaController");
        return articuloJpaController.getArticuloList(codigo, descripcion);
    }

    @Override
    public void desactivarArticulo(List<Articulo> articulos) throws RuntimeException {
        ArticuloJpaController articuloJpaController = (ArticuloJpaController) getServletContext().getAttribute("articuloJpaController");
        for (Articulo articulo : articulos) {
            articulo.setSnestado(false);
            try {
                articuloJpaController.edit(articulo);
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(ArticuloServiceImpl.class.getName()).log(Level.SEVERE, ex.getMessage());
                throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado en el sistema, intente de nuevo m&aacute;s tarde");
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(ArticuloServiceImpl.class.getName()).log(Level.SEVERE, "Registro no encontrado en la base de datos:" + ex.getMessage());
                throw new RuntimeException("Señor usuario, el articulo no se encuentra registrado en la base de datos, por tanto no pudo ser desactivado");
            } catch (Exception ex) {
                Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Otra excepci&oacute;n:" + ex.getMessage());
                throw new RuntimeException("Señor usuario, ocurri&oacute; un error inesperado en el sistema, intente de nuevo m&aacute;s tarde");
            }
        }
    }

    @Override
    public Articulo getArticuloXId(String codigo) throws RuntimeException {
        ArticuloJpaController articuloJpaController = (ArticuloJpaController) getServletContext().getAttribute("articuloJpaController");
        return articuloJpaController.findArticulo(codigo);
    }
}